package com.spring.security.controller;

import org.springframework.context.annotation.Profile;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Classname: SecurityController
 * @Description: 描述
 * @Date: 2021/12/24
 * @Author: HuWei
 */
@RestController
@RequestMapping("/security")
public class SecurityController {

    /**
     * 入门案例,没多少实际用处
     * @return
     */
    @GetMapping("/test")
    public String testSecurity(){
        return "hello security";
    }

    @GetMapping("/loginSuccess")
    public String loginSuccess(){
        return "登录成功";
    }

    @GetMapping("/loginOut")
    public String loginOut(){
        return "退出成功";
    }

    @GetMapping("/unLogin")
    public String unLogin(){
        return "没有认证也能登录";
    }

    @GetMapping("/roleAdmin")
    public String roleAdmin(){
        return "admin角色可以访问";
    }

    /**
     * 使用注解判断权限,当角色是sale或manager时可以update,ROLE_是角色的前缀,在这个注解中必须要加上
     * @return
     */
    @GetMapping("/update")
    @Secured({"ROLE_sale","ROLE_manager"})
    public String update(){
        return "可以使用update功能";
    }

    /**
     * 使用@PreAuthorize注解在进入方法前进行权限判断,,当角色是admin或test可以使用这个方法,
     * 如果使用hasRole和hasAnyRole方法,需要加上ROLE_前缀,参考上面的@Secured注解
     */
    @GetMapping("/beforeUpdate")
    @PreAuthorize("hasAnyAuthority('admin','test')")
    public String beforeUpdate(){
        return "可以使用update,@PreAuthorize注解";
    }

    @GetMapping("/afterUpdate")
    @PostAuthorize("hasAnyAuthority('admin','test')")
    public String afterUpdate(){
        return "可以使用update,@PostAuthorize注解";
    }
}